用于记录coding过程中遇到的比较难解决或者有意思的问题,包括前端/后端(Node/Db),会持续更新...

后端

Node

redis集群模式下pipline报错(2019.3.14)

  • 问题描述: 在redis集群模式下,使用pipeline操作不同key值会报错All keys in the pipeline should belong to the same slot
  • 问题解决:

    • 去了解一下redis集群的slot: 集群中每个节点有固定slot的数量,所有存储的key值经过hash计算后会存放到不同slot,也就是不同节点,所以在pipline时如果key值索引不在同一个slot,就会报上述错误
    • 解决方式:如果不是同一类型的key值不要用pipline去操作,如果是同一类型,则用'{}'包裹住相同部分,因为这部分用于hash计算
    • 例如:redis.pipline().set('cache1', 1).set('cache2', 2).exec() 改为 redis.pipline().set('{cache}1', 1).set('{cache}2', 2).exec()
    • 原文档飞机票

eggjs修改文件reload问题(2017.8.30)

  • 问题描述: 以开发环境启动项目,在修改文件后eggjs自动reload,但reload后所有请求都是pendding状态且所有log都是正常状态.
  • 问题探索:

    • 在eggjs的issue中发现了类似的问题,基本是修改文件后不能reload,需要crtl+c手动重启,解决方式基本是重新安装依赖,但一顿操作后仍然不行.
    • 使用用脚手架新生成的项目仍然有这个问题
    • 同事电脑上并没有出现这个问题
    • 到官方issue提问,由于是个别现象大佬并不予解决
    • 目前可以确定问题是由电脑造成的,且只有我出现了这个问题.既然没有现成的解决方法于是只有将希望寄托在了源码上.
  • 解决问题:

    • 在eggjs文档中可以发现负责reload的是cluster-reload模块,代码很简单,只有80+行,而且很容易读懂.
    • reset()中分别打印出newWorker(重启后新的work进程)和firstWorker(旧work进程)的状态,可以发现一切都是按照正常情况在进行,只不过在最后新的work进程莫名奇妙的是dead状态,且没有触发任何重启.
    • 进行了一些尝试,最终有了一个成功的解决方案: 在cluster.fork()(fork新的work进程)前先firsterWorker.kill(KILL_SINGNAL)(杀死旧进程).
  • 后记: 虽然没有找到真正的问题原因(还可以继续深挖)但解决了reload那个蛋疼的问题,但这种方法需要修改node_modules中的源码很不方便,而且只能用于开发过程中,生产环境中必须要优雅的推出进程.

Sequelize migrate changeColumn 问题

  • 问题描述 修改字段类型报错cannot be cast to type integer
    数据库:Postgresql
    报错原因: 将字段的数据类型由STRING修改为INTEGER(完全按照文档写法queryInterface.changeColumn(tableName: String, attributeName: String, dataTypeOrOptions: Object, options: Object)),但通过Sequelize转换的sql语句存在问题,不适用于Postgresql,需要更改字段type的类型
  • 解决问题

    // 修改字段类型的代码应该为
    queryInterface.changeColumn('table', 'column', {
      type: 'INTEGER USING CAST("column" as INTEGER)',
      allowNull: false,
    })

    issue详情

前端

Vuejs

element-ui popover报错(2018.02.09)

  • 报错内容: [Vue warn]: Error in directive popover bind hook: "TypeError: Cannot read property '$refs' of undefined"
  • 代码

    <template>
        <div>
            <i
              class="icon-help"
              v-popover:popoverHelp
            />
            <Popover
              ref="popoverHelp"
              placement="top-start"
              title="标题"
              width="200"
              trigger="hover"
              content="这是一段内容,这是一段内容,这是一段内容,这是一段内容。"
            />
         </div>
    </template>
    <script>
    import { Popover } from 'element-ui'
    export default {
      name: 'Manage',
      components: { Popover },
      directives: {
        popover: Popover.directive
      }
    }
    </script>
  • 解决
    Popover的directive中只有一个bind生命周期的钩子,也只有一句代码vnode.context.$refs[binding.arg].$refs.reference = el;,报错中的$refs就是整个组建中的refs,原来是<Popover />写在了使用指令的后面,所以此时ref还没有在组件中注册,所以会报$refs undefined错误
  • 正确代码

    <template>
        <div>
            <Popover
              ref="popoverHelp"
              placement="top-start"
              title="标题"
              width="200"
              trigger="hover"
              content="这是一段内容,这是一段内容,这是一段内容,这是一段内容。"
            />
            <i
              class="icon-help"
              v-popover:popoverHelp
            />
        </div>
    </template>
    <script>
    import { Popover } from 'element-ui'
    export default {
      name: 'Manage',
      components: { Popover },
      directives: {
        popover: Popover.directive
      }
    }
    </script>

Leo_
669 声望22 粉丝

learning...